// let ajax = new XMLHttpRequest();
//         ajax.open('get','http://xin.com/1.1.yufan.php',true);
//         ajax.send();
//         ajax.onload=function(){
//             console.log(ajax.responseText);
//         }
/* 
    请求的地址 必须有 如果没有，直接抛出错误
    请求成功的回调函数 必须有
    success：function(res){
    
    }
  
    请求的方式 选填 但需要设置默认值
    是否异步  选填，但需要设置默认值

    请求的参数   选填
    请求失败的回调函数 选填
    error:funtion(){
    throw Error();
    }
*/
function Ajax(obj) {
    if (!obj) {
        throw Error('没有参数传入');
    }
    if (!obj.url) {
        throw Error('url是必填项');
    }
    if (!obj.success) {
        throw Error('success是必填项');
    }
    if (Object.prototype.toString.call(obj.success) != '[object Function]') {
        throw Error("success必须是一个函数");
    }
    let patter = {
        url: obj.url,
        type: obj.type || 'get',
        data: obj.data || '',
        async: obj.async == undefined ? true : obj.async,
        success: obj.success,
        error: obj.error || function (res) {
            console.log(res);
        }
    }
    if (patter.type != 'get' && patter.type != 'post') {
        throw Error('type的值暂且只能为get 和 post');
    }
    if (Object.prototype.toString.call(patter.async) != '[object Boolean]') {
        throw Error('async的类型必须是blooean');
    }

    let datatype = Object.prototype.toString.call(patter.data);
    if (datatype != '[object String]' && datatype != '[object Object]') {
        throw Error('data的类型只能是字符串和对象');
    }
    if (datatype == '[object String]' && patter.data) {
        if (!patter.data.includes('=')) {
            throw Error('字符串的格式为key=value');
        }
    }
    if (datatype == '[object Object]') {
        let str = '';
        for (let key in patter.data) {
            str += key + '=' + patter.data[key] + '&';
        }
        patter.data = str.substring(0, str.length - 1);
        
    }
    let ajax = new XMLHttpRequest();
    if (patter.type == 'get') {
        ajax.open(patter.type, patter.url + '?' + patter.data, patter.async);
       
        ajax.send();
    }
    if (patter.type == 'post') {
        ajax.open(patter.type, patter.url, patter.async);
        ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        ajax.send(patter.data);
    }
    if (patter.async == false) {
        if (/^2\d{2}$/.test(ajax.status)) {
            patter.success(ajax.responseText);
        }
        if (/^[345]\d{2}$/.test(ajax.status)) {
            patter.error(ajax.responseText);
        }
        return;
    }
    ajax.onload = function () {
        if (/^2\d{2}$/.test(ajax.status)) {
            patter.success(ajax.responseText);
        }
        if (/^[345]\d{2}$/.test(ajax.status)) {
            patter.error(ajax.responseText);
        }
       
    }
}

// Promise 封装
function pAjax(nobj) {
    let p = new Promise(function (resolve,reject) {
        Ajax({
            url: nobj.url,
            type: nobj.type,
            async: nobj.async,
            data:nobj.data,
            success: function (res) {
                resolve(res);
            },
            error: function (err) {
                reject(err);
            },
        });
    });
    return p;
}